package com.yztstudy.Controller;


import com.yztstudy.Service.ProductService;
import com.yztstudy.param.ProductHotParam;
import com.yztstudy.param.ProductIdParam;
import com.yztstudy.param.ProductIdsParam;
import com.yztstudy.param.ProductPromoParam;
import com.yztstudy.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 产品的表示层
 */

@RestController
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private ProductService productService;


    /**
     * TODO 查询类别的主键
     * @param productPromoParam 前端发过来的类别名称
     * @param result 校验结果
     * @return
     */
    @PostMapping("/promo")
    public R promo(@RequestBody @Validated ProductPromoParam productPromoParam, BindingResult result)
    {
        // TODO 1.如果校验失败
        if (result.hasErrors())
        {
            return R.fail("参数有误,数据查询失败!");
        }

        // TODO 2.如果校验成功,就交给业务逻辑层处理
        return productService.promo(productPromoParam);
    }


    /**
     * TODO 多类别的热门商品查询
     * @param productHotParam 前端传过来的热门商品名称
     * @param result 校验后的结果
     * @return
     */
    @PostMapping("/hots")
    public R hots(@RequestBody @Validated ProductHotParam productHotParam, BindingResult result)
    {
        // TODO 1.如果校验失败
        if (result.hasErrors())
        {
            return R.fail("参数有误,数据查询失败!");
        }

        // TODO 2.如果校验成功,就交给业务逻辑层处理
        return productService.hots(productHotParam);
    }


    /**
     * TODO 查询全部的商品类别
     * @return
     */
    @PostMapping("/category/list")
    public R list()
    {
        return productService.list();
    }


    /**
     * TODO 指定商品类别的分页查询
     * @param productIdsParam 前端传过来的参数(id数组，当前页面和每一页的大小)
     * @param result 校验后的结果
     * @return
     */
    @PostMapping("/bycategory")
    public R byCategory(@RequestBody @Validated ProductIdsParam productIdsParam, BindingResult result)
    {
        // TODO 1.如果校验失败
        if (result.hasErrors())
        {
            return R.fail("参数有误,数据查询失败!");
        }

        // TODO 2.如果校验成功,就交给业务逻辑层处理
        return productService.byCategory(productIdsParam);
    }


    /**
     * TODO 查询全部的商品
     * @param productIdsParam 前端传过来的参数(id数组，当前页面和每一页的大小)
     * @param result 校验后的结果
     * @return
     */
    @PostMapping("/all")
    public R all(@RequestBody @Validated ProductIdsParam productIdsParam, BindingResult result)
    {
        // TODO 1.如果校验失败
        if (result.hasErrors())
        {
            return R.fail("参数有误,数据查询失败!");
        }

        // TODO 2.如果校验成功,就交给业务逻辑层处理
        return productService.byCategory(productIdsParam);
    }


    /**
     * TODO 查询详情
     * @param productIdParam 商品的ID
     * @param result 校验的结果
     * @return
     */
    @PostMapping("/detail")
    public R detail(@RequestBody @Validated ProductIdParam productIdParam, BindingResult result)
    {
        // TODO 1.如果校验失败
        if (result.hasErrors())
        {
            return R.fail("参数有误,数据查询失败!");
        }

        // TODO 2.如果校验成功,就交给业务逻辑层处理
        return productService.detail(productIdParam);
    }


    /**
     * TODO 商品的图片查询
     * @param productIdParam 商品的ID
     * @param result 校验的结果
     * @return
     */
    @PostMapping("/pictures")
    public R pictures(@RequestBody @Validated ProductIdParam productIdParam, BindingResult result)
    {
        // TODO 1.如果校验失败
        if (result.hasErrors())
        {
            return R.fail("参数有误,数据查询失败!");
        }

        // TODO 2.如果校验成功,就交给业务逻辑层处理
        return productService.pictures(productIdParam);
    }
}
